package algo;
import tree.*;
import java.util.*;
/**
* Classe representant l'etat actuel du tri
* @author Kevin Georgy
* @since 13.06.2007	
* @version 1.0
*/

public class QuickSortState extends Observable {
	
	/**
	* Tableau des element a trier
	*/	
	ArrayList<Comparable> array = new ArrayList<Comparable>();
   
	/**
	* Arbre des partitions
	*/	
	Tree<Partition> partitionTree = new Tree<Partition>(new Partition(0,0));
   
	/**
	* Partition courante
	*/	
	Tree<Partition> current = partitionTree;
	
	/**
	* Curseur droit
	*/	
	int rightCursor;
   
	/**
	* Curseur gauche
	*/	
	int leftCursor;
	
	/**
	* Element de reference
	*/	
	Comparable reference;
	
	/**
	* Indique si le tri est demarre
	*/	
	boolean started = false;
   
	/**
	* Indique si le tri est termine
	*/	
	boolean finished = false;
	
	/**
	* Derniere etape qui a ete appliquee
	*/	
	Step lastStep;
	
	/**
	* Construit un etat
	* @param aQuickSort QuickSort travaillant sur l'etat
	*/	
	QuickSortState(QuickSort aQuickSort) {
		current.getContent().isCurrent = true;
	}
   	
	/**
	* Indique que l'etat a change
	*/
	void change() {
		setChanged();
		notifyObservers();
	}

	/**
	* Initialise l'etat
	*/	
	void init() {
		partitionTree.clear();
		partitionTree.setContent(new Partition(0, array.size()-1));
		current = partitionTree;
		reference = null;
		finished = false;
	}
	
	/**
	* Retourne l'arbre des partition
	* @return Arbre des partitions
	*/	
	public Tree<Partition> tree() {
		return partitionTree;
	}
	
	/**
	* Retourne une copie du tableau des elements
	* @return Copie du tableau des elements
	*/	
	public ArrayList<Comparable> items() {
		return (ArrayList<Comparable>) array.clone();
	}
	
	/**
	* Retourne l'indice du debut de la patition courante
	* @return Indice de debut
	*/	
	public int begin() {
		return current.getContent().begin;
	}
   
	/**
	* Retourne l'indice du fin de la patition courante
	* @return Indice de fin
	*/	
	public int end() {
		return current.getContent().end;
	}
	
	/**
	* Retourne le curseur droit
	* @return Curseur droit
	*/	
	public int rightCursor() {
		return rightCursor;
	}
	
	/**
	* Retourne le curseur gauche
	* @return Curseur gauche
	*/	
	public int leftCursor() {
		return leftCursor;
	}
	
	/**
	* Retourne la valeur de la reference
	* @return Valeur de la reference
	*/	
	public Comparable reference() {
		return reference;
	}
	
	/**
	* Indique si le tri est en cours
	* @return Vrai si le tri est en cours, sinon faux
	*/	
	public boolean started()
	{
		return started;
	}
	
	/**
	* Indique si le tri est termine
	* @return Vrai si le tri est termine, sinon faux
	*/	
	public boolean finished() {
		return finished;
	}
	
	/**
	* Retourne la derniere etape appliquee
	* @return Derniere etape appliquee
	*/	
	public Step lastStep() {
		return lastStep;
	}
	
	/**
	* Nombre d'elements a trier
	* @return Nombre d'elements du tableau
	*/	
	public int size() {
		return array.size();
	}

}
